package com.bt.lms.ui.page.sys.study;

import com.alibaba.fastjson.JSONObject;
import com.bt.lms.entity.StudyCen;
import com.bt.lms.entity.page.Page;
import com.bt.lms.ui.page.sys.role.PageUserList;
import com.bt.lms.ui.page.sys.study.action.ListCompileBtn;
import com.bt.lms.ui.page.sys.study.action.SLDeleteBtnAction;
import com.bt.lms.ui.page.sys.study.action.SLDetailsBtn;
import com.bt.lms.ui.page.sys.utils.MyButton;
import com.bt.lms.ui.page.sys.vo.StudyCenTableViewVo;
import com.bt.lms.ui.page.sys.vo.StudyCenVo;
import com.bt.lms.ui.vo.PageSkipInfo;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.util.Callback;
import org.apache.commons.beanutils.BeanUtils;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

/**
 * 学习中心列表
 *
 * @author 徐大永
 */
public class StudyCenTableView extends TableView<StudyCenVo> {

    /**
     * 分页模型
     */
    private final Page<StudyCen> page;

    /**
     * 界面跳转信息
     */
    private final PageSkipInfo pageSkipInfo;

    /**
     * 构建学习中心列表
     *
     * @param inPane       列表所在一级容器（1位）
     * @param page    分页模型
     * @param pageSkipInfo 界面跳转信息
     */
    public StudyCenTableView(Pane inPane, Page<StudyCen> page, PageSkipInfo pageSkipInfo) {

        //维护
        this.page = page;
        this.pageSkipInfo = pageSkipInfo;


        //1.列头
        //1.1 新建列头
        TableColumn<StudyCenVo, String> nameTC = new TableColumn<>("学习中心名称");
        TableColumn<StudyCenVo, String> codeTC = new TableColumn<>("学习中心编码");
        TableColumn<StudyCenVo, String> relationPenTC = new TableColumn<>("联系人");
        TableColumn<StudyCenVo, String> phoneTC = new TableColumn<>("移动电话");
        TableColumn<StudyCenVo, String> emailTC = new TableColumn<>("电子邮箱");
        TableColumn<StudyCenVo, StudyCenTableViewVo> operateTC = new TableColumn<>("操作");

        //1.2 列头添加到视图
        this.getColumns().addAll(nameTC, codeTC, relationPenTC, phoneTC, emailTC, operateTC);

        //2.处理数据
        List<StudyCenVo> studyCenVos = dataInit();
        //2.2 格式转化(用户数据集合转换成Javafx组件集合)
        ObservableList<StudyCenVo> users = FXCollections.observableArrayList(studyCenVos);
        //2.3 数据添加到表格
        this.setItems(users);
        
        //自定义渲染
        customVRay(operateTC);

        //3.映射（让每一列知道要展示的属性是哪一个）
        nameTC.setCellValueFactory(new PropertyValueFactory<>("name"));
        codeTC.setCellValueFactory(new PropertyValueFactory<>("code"));
        relationPenTC.setCellValueFactory(new PropertyValueFactory<>("relationPen"));
        phoneTC.setCellValueFactory(new PropertyValueFactory<>("phone"));
        emailTC.setCellValueFactory(new PropertyValueFactory<>("email"));
        operateTC.setCellValueFactory(new PropertyValueFactory<>("studyCenTableViewVo"));
    } 

    /**
     * 数据处理
     * @return  处理好的数据
     */
    private List<StudyCenVo> dataInit() {

        //要返回的数据
        List<StudyCenVo> studyCenVos = new ArrayList<>();

        List<StudyCen> studyCenS = page.getRecords();

        for (Object record : studyCenS) {
            //解JSON
            JSONObject roleJSON = (JSONObject) record;
            StudyCen studyCen = roleJSON.toJavaObject(StudyCen.class);
            StudyCenVo studyCenVo = new StudyCenVo();
            try {
                BeanUtils.copyProperties(studyCenVo, studyCen);
                //对象维护 用户操作视图对象
                StudyCenTableViewVo studyCenTableViewVo = new StudyCenTableViewVo();
                BeanUtils.copyProperties(studyCenTableViewVo, studyCenVo);
                studyCenVo.setStudyCenTableViewVo(studyCenTableViewVo);

            } catch (IllegalAccessException | InvocationTargetException e) {
                throw new RuntimeException(e);
            }
            studyCenVos.add(studyCenVo);
        }


        return studyCenVos;
    }

    /**
     * 操作按钮盒子初始化
     *
     * @param studyCenTableViewVo 学习中心列表信息
     * @return 操作按钮盒子
     */
    private HBox operateHBoxInit(StudyCenTableViewVo studyCenTableViewVo) {

        //新建操作盒子
        HBox operateHBox = new HBox();
        operateHBox.setPadding(new Insets(2));
        operateHBox.setSpacing(10);

        //操作按钮(查看详情
        MyButton detailsBtn = new MyButton("查看详情");
        operateHBox.getChildren().add(detailsBtn);
        //事件
        SLDetailsBtn SLDetailsBtn = new SLDetailsBtn(studyCenTableViewVo, pageSkipInfo);
        detailsBtn.setOnAction(SLDetailsBtn);

        //操作按钮(编辑
        MyButton compileBtn = new MyButton("编辑");
        operateHBox.getChildren().add(compileBtn);
        //事件
        ListCompileBtn listCompileBtn = new ListCompileBtn(studyCenTableViewVo, pageSkipInfo);
        compileBtn.setOnAction(listCompileBtn);

        //操作按钮(设置专业
        MyButton setMajorBtn = new MyButton("设置专业");
        operateHBox.getChildren().add(setMajorBtn);
        //事件
        setMajorBtn.setOnAction(event -> {
            //界面跳转
            Pane pane = pageSkipInfo.getPane();//界面所在容器
            StudyCen studyCen = new StudyCen();//对方要的参数
            studyCen.setId(studyCenTableViewVo.getId());
            PageMajorList pageMajorList = new PageMajorList(pageSkipInfo,studyCen,page);
            pane.getChildren().set(pageSkipInfo.getIndex(),pageMajorList);//跳转
        });

        //操作按钮(删除
        MyButton deleteBtn = new MyButton("删除");
        operateHBox.getChildren().add(deleteBtn);
        //事件
        SLDeleteBtnAction slDeleteBtnAction = new SLDeleteBtnAction(studyCenTableViewVo, pageSkipInfo);
        deleteBtn.setOnAction(slDeleteBtnAction);

        return operateHBox;
    }

    /**
     * 自定义界面渲染
     * 
     * @param operateTC   操作列
     */
    private void customVRay(TableColumn<StudyCenVo, StudyCenTableViewVo> operateTC) { 

        //操作列自定义
        operateTC.setCellFactory(new Callback<TableColumn<StudyCenVo, StudyCenTableViewVo>, TableCell<StudyCenVo, StudyCenTableViewVo>>() {
            @Override
            public TableCell<StudyCenVo, StudyCenTableViewVo> call(TableColumn<StudyCenVo, StudyCenTableViewVo> param) {
                return new TableCell<StudyCenVo, StudyCenTableViewVo>() {
                    @Override
                    protected void updateItem(StudyCenTableViewVo studyCenTableViewVo, boolean empty) {
                        //覆盖TableCell的样式更新
                        super.updateItem(studyCenTableViewVo, empty);
                        if (studyCenTableViewVo != null) {
                            HBox hBox = operateHBoxInit(studyCenTableViewVo);
                            setGraphic(hBox);//界面显示
                        }
                    }
                };
            }
        });

    }
}
